package br.com.jk.cotacao.itens;

import br.com.jk.cotacao.Cotacao;
import br.com.jk.produto.Produto;
import br.com.jk.util.StatusType.StatusEstoque;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import java.util.Objects;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.UniqueConstraint;
import org.hibernate.annotations.ForeignKey;

/**
 * @author camilo
 */
@Entity
@Table(name = CotacaoItensDao.NAME_TABLE, schema = CotacaoItensDao.NAME_SCHEMA,
        uniqueConstraints = {
  @UniqueConstraint(name = CotacaoItensDao.NAME_UK_PRODUTO_COTACAO,
          columnNames = {CotacaoItensDao.NAME_COLUMN_ID_PRODUTO, CotacaoItensDao.NAME_COLUMN_ID_COTACAO})
})
public class CotacaoItens implements Serializable {

  public static final String ATTRIBUTE_ID = "id";
  public static final String ATTRIBUTE_QUANTIDADE = "quantidade";
  public static final String ATTRIBUTE_VALOR_COTADO = "valorCotado";
  public static final String ATTRIBUTE_STATUS = "status";
  public static final String ATTRIBUTE_DATA_CADASTRO = "dataCadastro";
  public static final String ATTRIBUTE_DATA_ALTERACAO = "dataAlteracao";
  public static final String ATTRIBUTE_IS_VINCULADO = "isVinculado";
  public static final String ATTRIBUTE_FATOR = "fator";
  public static final String ATTRIBUTE_PRODUTO_VINCULADO = "produtoVinculado";
  public static final String ATTRIBUTE_COTACAO = "cotacao";
  public static final String ATTRIBUTE_PRODUTO = "produto";
  @Id
  @SequenceGenerator(name = CotacaoItensDao.NAME_SEQUENCE, sequenceName = CotacaoItensDao.NAME_SEQUENCE,
          schema = CotacaoItensDao.NAME_SCHEMA)
  @GeneratedValue(strategy = GenerationType.AUTO, generator = CotacaoItensDao.NAME_SEQUENCE)
  private int id;
  @Column(nullable = false, name = CotacaoItensDao.NAME_COLUMN_QUANTIDADE)
  private int quantidade;
  @Column(nullable = false, name = CotacaoItensDao.NAME_COLUMN_VALOR_COTADO)
  private BigDecimal valorCotado;
  @Column(name = CotacaoItensDao.NAME_COLUMN_STATUS, nullable = false)
  private StatusEstoque status;
  @Temporal(TemporalType.DATE)
  @Column(name = CotacaoItensDao.NAME_COLUMN_DATA_CADASTRO, nullable = false, updatable = false)
  private Date dataCadastro;
  @Temporal(TemporalType.DATE)
  @Column(name = CotacaoItensDao.NAME_COLUMN_DATA_ALTERACAO)
  private Date dataAlteracao;
  @Column(name = CotacaoItensDao.NAME_COLUMN_IS_VINCULADO)
  private Boolean isVinculado;
  @Column(name = CotacaoItensDao.NAME_COLUMN_FATOR)
  private int fator;
  @Column(name = CotacaoItensDao.NAME_COLUMN_COD_NA_COTACAO)
  private int codNaCotacao;
  @Column(name = CotacaoItensDao.NAME_COLUMN_SEQUENCIAL)
  private int sequencial;
  @ManyToOne
  @JoinColumn(name = CotacaoItensDao.NAME_COLUMN_PRODUTO_VINCULADO)
  @ForeignKey(name = CotacaoItensDao.NAME_FK_COTACAOITENS_PRODUTO_VINC)
  private Produto produtoVinculado;
  @ManyToOne
  @JoinColumn(name = CotacaoItensDao.NAME_COLUMN_ID_COTACAO, nullable = false)
  @ForeignKey(name = CotacaoItensDao.NAME_FK_COTACAOITENS_COTACAO)
  private Cotacao cotacao;
  @ManyToOne
  @JoinColumn(name = CotacaoItensDao.NAME_COLUMN_ID_PRODUTO, nullable = false)
  @ForeignKey(name = CotacaoItensDao.NAME_FK_COTACAOITENS_PRODUTO)
  private Produto produto;

  public int getCodNaCotacao() {
    return codNaCotacao;
  }

  public void setCodNaCotacao(int codNaCotacao) {
    this.codNaCotacao = codNaCotacao;
  }

  public int getSequencial() {
    return sequencial;
  }

  public void setSequencial(int sequencial) {
    this.sequencial = sequencial;
  }

  public int getId() {
    return id;
  }

  public void setId(int id) {
    this.id = id;
  }

  public int getQuantidade() {
    return quantidade;
  }

  public void setQuantidade(int quantidade) {
    this.quantidade = quantidade;
  }

  public BigDecimal getValorCotado() {
    return valorCotado;
  }

  public void setValorCotado(BigDecimal valorCotado) {
    this.valorCotado = valorCotado;
  }

  public StatusEstoque getStatus() {
    return status;
  }

  public void setStatus(StatusEstoque status) {
    this.status = status;
  }

  public Date getDataCadastro() {
    return dataCadastro;
  }

  public void setDataCadastro(Date dataCadastro) {
    this.dataCadastro = dataCadastro;
  }

  public Date getDataAlteracao() {
    return dataAlteracao;
  }

  public void setDataAlteracao(Date dataAlteracao) {
    this.dataAlteracao = dataAlteracao;
  }

  public Boolean getIsVinculado() {
    return isVinculado;
  }

  public void setIsVinculado(Boolean isVinculado) {
    this.isVinculado = isVinculado;
  }

  public int getFator() {
    return fator;
  }

  public void setFator(int fator) {
    this.fator = fator;
  }

  public Produto getProdutoVinculado() {
    return produtoVinculado;
  }

  public void setProdutoVinculado(Produto produtoVinculado) {
    this.produtoVinculado = produtoVinculado;
  }

  public Cotacao getCotacao() {
    return cotacao;
  }

  public void setCotacao(Cotacao cotacao) {
    this.cotacao = cotacao;
  }

  public Produto getProduto() {
    return produto;
  }

  public void setProduto(Produto produto) {
    this.produto = produto;
  }

  @Override
  public int hashCode() {
    int hash = 7;
    hash = 97 * hash + this.id;
    hash = 97 * hash + this.quantidade;
    hash = 97 * hash + Objects.hashCode(this.valorCotado);
    hash = 97 * hash + Objects.hashCode(this.status);
    hash = 97 * hash + Objects.hashCode(this.dataCadastro);
    hash = 97 * hash + Objects.hashCode(this.dataAlteracao);
    hash = 97 * hash + Objects.hashCode(this.isVinculado);
    hash = 97 * hash + this.fator;
    hash = 97 * hash + Objects.hashCode(this.produtoVinculado);
    hash = 97 * hash + Objects.hashCode(this.cotacao);
    hash = 97 * hash + Objects.hashCode(this.produto);
    return hash;
  }

  @Override
  public boolean equals(Object obj) {
    if (obj == null) {
      return false;
    }
    if (getClass() != obj.getClass()) {
      return false;
    }
    final CotacaoItens other = (CotacaoItens) obj;
    if (this.id != other.id) {
      return false;
    }
    if (this.quantidade != other.quantidade) {
      return false;
    }
    if (!Objects.equals(this.valorCotado, other.valorCotado)) {
      return false;
    }
    if (this.status != other.status) {
      return false;
    }
    if (!Objects.equals(this.dataCadastro, other.dataCadastro)) {
      return false;
    }
    if (!Objects.equals(this.dataAlteracao, other.dataAlteracao)) {
      return false;
    }
    if (!Objects.equals(this.isVinculado, other.isVinculado)) {
      return false;
    }
    if (this.fator != other.fator) {
      return false;
    }
    if (!Objects.equals(this.produtoVinculado, other.produtoVinculado)) {
      return false;
    }
    if (!Objects.equals(this.cotacao, other.cotacao)) {
      return false;
    }
    if (!Objects.equals(this.produto, other.produto)) {
      return false;
    }
    return true;
  }
}
